有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java非静态createnewfrom方法?

我有时编写的类可以转换成其他东西,也可以从其他东西转换而来,我习惯于将其作为非静态的convert-to方法和静态convert-from方法来编写,例如:

class A {
    B toB() {...}
    static A fromB(B b) {...}
}

或者

class B {
    void save(File f) {...}
    static B load(File f) {...}
}

我以前认为这是一种很好且简单的方法,但最近从方法转换的静态特性一直困扰着我,例如,如果我想为可以转换为-和从-B的类型定义一个接口:

interface ConvertableToAndFromB {
    B toB();
    // ?
}

那么,除了迁移到Smalltalk之外,有没有一种优雅的方法可以在不转换为静态的情况下实现这一点

编辑

为了澄清,我意识到我可以在界面中添加一个非静态方法,例如:

interface ConvertableToAndFromB {
    B toB();
    void fromB(B b);
}

或者,如果我想允许不可变类型(感谢条带化):

interface ConvertableToAndFromB<T implements ConvertibleToAndFromB<T>> {
    B toB();
    T fromB(B b);
}

但这需要我在调用之前创建一个新的A,比如:

A a = new A();
a.fromB(b);

或者(对于不可变):

A a = new A();
a = a.fromB(b);

这就是我试图避免的(但没有其他解决方案)。我只是希望有更好的方式


共 (1) 个答案

  1. # 1 楼答案

    你应该能够使你的接口递归通用。我相信语法是这样的:

    interface ConvertibleToAndFromB<T implements ConvertibleToAndFromB<T>>{
        B toB();
        T fromB(B b);
    }
    
    class A implements ConvertibleToAndFromB<A> {
        B toB() {...}
        A fromB(B b);
    }
    

    让事情变得更加类型化有明显的优势。然而,这确实意味着在调用fromB时,您必须对所需的实际类型有所了解。这种方法有优点也有缺点

    作为补充说明,让A负责生成类型为AB的对象违反了单一责任原则,我通常更希望有一个单独的转换器类或接口来执行这些操作

    Converter<A, B> converter = converterFactory.get<A, B>(A.class, B.class);
    B b = converter.from(a);